import pandas as pd
import re

# ---------------------- 1. 读取student.xlsx文件内容，并打印输出 ----------------------
# 读取xlsx文件（指定sheet_name为"Sheet1"，openpyxl为引擎）
df = pd.read_excel("C:/Users/admin/Desktop/123/student.xlsx", sheet_name="Sheet1", engine="openpyxl")

# 打印数据基本信息（行数、列数、列名）
print("=" * 80)
print("1. student.xlsx 文件内容：")
print(f"数据总行数：{len(df)} 行")
print(f"数据总列数：{len(df.columns)} 列")
print(f"列名：{list(df.columns)}")
print("\n前5行数据预览：")
print(df.head())  # 打印前5行（避免输出过长）
print("完整数据（可删除.head()查看全部）：")
print(df)  # 若需查看全部数据，保留此句；否则用head()限制输出


# ---------------------- 2. 按性别统计学生人数，并打印输出 ----------------------
# 用value_counts()统计性别频次，sort=False保持原顺序
gender_count = df["性别"].value_counts(sort=False)

print("\n" + "=" * 80)
print("2. 按性别统计学生人数：")
for gender, count in gender_count.items():
    print(f"{gender}生：{count} 人")
# 验证总数（可选）
print(f"总计：{gender_count.sum()} 人（与总人数一致，统计正确）")


# ---------------------- 3. 按年龄段统计学生人数，并打印输出 ----------------------
# 定义年龄段划分规则（常见学生年龄段：未成年、青年、中年）
def get_age_group(age):
    if age < 18:
        return "未成年（<18岁）"
    elif 18 <= age < 30:
        return "青年（18-29岁）"
    elif 30 <= age < 50:
        return "中年（30-49岁）"
    else:
        return "中老年（≥50岁）"

# 新增"年龄段"列，应用划分规则
df["年龄段"] = df["年龄"].apply(get_age_group)

# 统计各年龄段人数
age_group_count = df["年龄段"].value_counts()

print("\n" + "=" * 80)
print("3. 按年龄段统计学生人数：")
for age_group, count in age_group_count.items():
    print(f"{age_group}：{count} 人")
# 验证总数（可选）
print(f"总计：{age_group_count.sum()} 人（与总人数一致，统计正确）")


# ---------------------- 4. 按地区统计学生人数（外省按省份，海南按市县） ----------------------
def extract_region(address):
    """
    从家庭地址中提取地区：
    - 海南地址：提取"海南省"后的第一个市县（如"儋州市"、"海口市"）
    - 外省地址：提取第一个省份/自治区/直辖市（如"吉林省"、"广西壮族自治区"）
    """
    # 正则表达式：匹配"海南省XX市/县"或"XX省/自治区/直辖市"
    hainan_pattern = r"海南省([^市县区]+[市县区])"  # 匹配海南的市县（如"儋州市"）
    other_province_pattern = r"([^省市区]+[省自治区直辖市])"  # 匹配外省的省份（如"吉林省"）
    
    # 优先匹配海南地址
    hainan_match = re.search(hainan_pattern, address)
    if hainan_match:
        return hainan_match.group(1)  # 返回海南的市县（如"儋州市"）
    
    # 匹配外省地址
    other_match = re.search(other_province_pattern, address)
    if other_match:
        return other_match.group(1)  # 返回外省的省份（如"吉林省"）
    
    # 若地址格式异常，返回"未知地区"
    return "未知地区"

# 新增"地区"列，应用提取规则
df["地区"] = df["家庭地址"].apply(extract_region)

# 统计各地区人数（按人数降序排列）
region_count = df["地区"].value_counts().sort_values(ascending=False)

print("\n" + "=" * 80)
print("4. 按地区统计学生人数（外省按省份，海南按市县）：")
for region, count in region_count.items():
    print(f"{region}：{count} 人")
# 验证总数（可选）
print(f"总计：{region_count.sum()} 人（与总人数一致，统计正确）")